#pragma clang diagnostic push
#pragma ide diagnostic ignored "modernize-use-nodiscard"
#ifndef SIMPLE_THREAD_CPP_STL_THREAD_H
#define SIMPLE_THREAD_CPP_STL_THREAD_H

#include <thread>
#include <ctime>
#include <functional>
#include "task_queue.h"
#include "thread_state.h"

namespace simpleThread {
    class STLThread {
    private:
        // 工作线程
        std::thread *workThread = nullptr;

        // 线程名称
        std::string workThreadName;

        // 任务队列
        TaskQueue *queue;

        // join 状态, 阻塞线程等待所有任务完成
        volatile bool joinState = false;

        // 线程状态
        volatile ThreadState state = activate;

        // 线程最近执行时间戳, 用于空闲回收
        time_t executeTime = std::time(nullptr);

        // 线程检查器, 用于判断线程是否继续执行
        std::function<bool(STLThread &)> checker;

        // 钩子, 创建线程时执行
        std::function<bool(STLThread &)> initCall;

        void execInitCall();

        // 钩子, 退出线程时执行
        std::function<bool(STLThread &)> exitCall;

        void execExitCall();

        // 执行队列任务
        void execute();

        // 判断是否继续支持, 线程状态、执行检查器等
        bool isBreak();

        // 执行业务
        static void work(const std::function<void()> &) noexcept;

    public:
        explicit STLThread(TaskQueue *queue);

        ~STLThread();

        // 启动工作线程
        void start();

        // 获取线程id
        std::thread::id getId();

        // 获取线程最近执行时间戳
        time_t getExecuteTime() const;

        // 阻塞线程, 等待所有任务完成
        void join();

        // 关闭线程, 阻塞正在执行任务继续完成, 未执行任务丢弃
        void shutdown();

        // 线程超时, 不在执行新任务
        void timeout();

        // 获取线程状态
        volatile ThreadState getState() const;

        void setChecker(const std::function<bool(STLThread &)> &function);

        void setInitCall(const std::function<bool(STLThread &)> &function);

        void setExitCall(const std::function<bool(STLThread &)> &function);
    };
}

#endif //SIMPLE_THREAD_CPP_STL_THREAD_H

#pragma clang diagnostic pop